#pragma once

#include "funpl.h"
#include "ast.h"

namespace funpl
{

namespace ast
{

/// Module identifier node.
struct module_identifier : public node
{
	util::const_char_range name;

	module_identifier *nested;

	/// Constructor.
	module_identifier(node *parent = nullptr,
		const util::const_char_range &name = util::empty_const_char_range(),
		module_identifier *nested = nullptr)
			: node(node_type::module_name, parent),
			name(name),
			nested( reparent(nested, this) ) { }
};

/// Import node.
struct import : public node
{
	module_identifier *identifier;

	/// Constructor.
	import(node *parent = nullptr,
		module_identifier *identifier = nullptr)
			: node(node_type::import, parent),
			identifier( reparent(identifier, this) ) { }
};

struct namespace_;

/// Module node.
struct module : public node
{
	module_identifier *identifier;

	typedef std::vector<import*> import_vector;
	import_vector imports;

	namespace_ *global;

	/// Constructor.
	module(node *parent = nullptr,
		module_identifier *identifier = nullptr)
			: node(node_type::module, parent),
			identifier( reparent(identifier, this) ),
			global() { }
};

} // namespace

} // namespace